// 1. 이메일 정규식
function validateEmail( email )
{
	var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
	return re.test( email );
}

// 2. 토스트
function setResult( text )
{
	$( '#result' ).css( "background-color", '#00aa22' );
	$( '#result' ).empty().text( text );
}
function appendResult( text )
{
	$( '#result' ).append( text );
}
function setResultFail( title, responseData )
{
	setResult( title + ' :: Code = '+$(responseData).find( 'code' ).text()+', MESSAGE = '+$(responseData).find( 'message' ).text() );
	$( '#result' ).css( "background-color", '#cc2200' );
}
function setResultFailForJSON( title, json )
{
	setResult( title + ' :: Code = '+json.code+', MESSAGE = '+json.message );
	$( '#result' ).css( "background-color", '#cc2200' );
}

function getGatePath()
{
	if( window.__isClientMode__ )
	{
		return 'api/_gatec.php';
	}
	return 'api/_gate.php';
}
	

// 3. 지역 설정 정보 가져오기
var _g_regionInfos 		= null;
var _g_educationInfos 	= null;
var _g_militaryInfos 	= null;
var _g_partyInfos 		= null;
var _g_rankInfos 		= null;
var _g_dutyInfos 		= null;
var _g_completedInfos 	= null;
var _g_businessInfos 	= null;
var _g_historyInfos 	= null;
var _g_snsInfos 		= null;
var _g_actionInfos 		= null;
var _g_voteInfos 		= null;
var _g_registPlatformInfos 		= null; // 가입된 플랫폼
var _g_statInfos 		= null;	// 특별히 이중배열을 갖는다.
var _g_menuInfos 		= null;	// 메뉴 구성용 데이터 셋 : DB에서 가공된...
function getSettingInfos( completeHandler, failHandler )
{
	if( _g_regionInfos ){
		completeHandler.call( null );
		return;
	}
		
	$.post( getGatePath(),
	{
		__key__: 'getSettingInfos',
		__returnType__: 'json'
	},
	function( data )
	{
		if( data.result == "SUCCESS" )
		{
			var _item;
			// 지역 정보
			_g_regionInfos  = [];
			for( var idx in data.region.item )
			{
				_item = data.region.item[ idx ];
				_g_regionInfos.push(
						{ 
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							parent_code: _item[ 'parent_code' ],
							image_url: _item[ 'image_url' ]
						});
			}
			// 교육 정보
			_g_educationInfos = [];
			for( var idx in data.education.item )
			{
				_item = data.education.item[ idx ];
				_g_educationInfos.push(
						{ 
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							level: _item[ 'level' ]
						});
			}
			// 병역 정보
			_g_militaryInfos = [];
			for( var idx in data.military.item )
			{
				_item = data.military.item[ idx ];
				_g_militaryInfos.push(
						{ 
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							level: _item[ 'level' ]
						});
			}
			// 정당 정보
			_g_partyInfos = [];
			for( var idx in data.party.item )
			{
				_item = data.party.item[ idx ];
				_g_partyInfos.push(
						{ 
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							image_url: _item[ 'image_url' ]
						});
			}
			// 직급 정보
			_g_rankInfos = [];
			for( var idx in data.rank.item )
			{
				_item = data.rank.item[ idx ];
				_g_rankInfos.push(
						{ 
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							level: _item[ 'level' ],
							image_url: _item[ 'image_url' ]
						});
			}
			// 직책 정보
			_g_dutyInfos = [];
			for( var idx in data.duty.item )
			{
				_item = data.duty.item[ idx ];
				_g_dutyInfos.push(
						{ 
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							rank_code: _item[ 'rank_code' ],
							image_url: _item[ 'image_url' ]
						});
			}
			// 완수 정보
			_g_completedInfos = [];
			for( var idx in data.completed.item )
			{
				_item = data.completed.item[ idx ];
				_g_completedInfos.push(
						{ 
							code: _item[ 'code' ],
							name: _item[ 'name' ]
						});
			}
			// 사업 구분
			_g_businessInfos = [];
			for( var idx in data.business.item )
			{
				_item = data.business.item[ idx ];
				_g_businessInfos.push(
						{
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							level: _item[ 'level' ]
						});
			}
			// 약력 구분
			_g_historyInfos = [];
			for( var idx in data.history.item )
			{
				_item = data.history.item[ idx ];
				_g_historyInfos.push(
						{
							code: _item[ 'code' ],
							name: _item[ 'name' ]
						});
			}
			// SNS 구분
			_g_snsInfos = [];
			for( var idx in data.sns.item )
			{
				_item = data.sns.item[ idx ];
				_g_snsInfos.push(
						{
							code: _item[ 'code' ],
							name: _item[ 'name' ]
						});
			}
			// 투표 구분
			_g_voteInfos = [];
			for( var idx in data.vote.item )
			{
				_item = data.vote.item[ idx ];
				_g_voteInfos.push(
						{
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							point: _item[ 'point' ]
						});
			}
			// 참여 구분
			_g_actionInfos	= [];
			for( var idx in data.action.item )
			{
				_item = data.action.item[ idx ];
				_g_actionInfos.push(
						{
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							point: _item[ 'point' ]
						});
			}
			// 가입 플랫폼
			_g_registPlatformInfos = [];
			for( var idx in data.platform.item )
			{
				_item = data.platform.item[ idx ];
				_g_registPlatformInfos.push(
						{
							code: _item[ 'code' ],
							name: _item[ 'name' ]
						});
			}
			
			// 능력치 구분
			_g_statInfos = [];	// 특별히 이중 배열을 갖는다.
			for( var idx in data.stat.item )
			{
				_item = data.stat.item[ idx ];
				var _group = parseInt( _item[ 'group' ] );
				if( _g_statInfos[ _group ] == undefined )
					_g_statInfos[ _group ] = [];
					
				_g_statInfos[ _group ].push(
						{
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							group: _item[ 'group' ]
						});
			}
			
			// 매뉴 셋
			_g_menuInfos = [];	// 특별히 이중 배열을 갖는다.
			for( var idx in data.menu.item )
			{
				_item = data.menu.item[ idx ];
				_g_menuInfos.push(
						{
							id: _item[ 'id' ],
							type: _item[ 'type' ],
							code: _item[ 'code' ],
							name: _item[ 'name' ],
							image_url: _item[ 'image_url' ],
							parent_id: _item[ 'parent_id' ]
						});
			}
			
			// 이미지 로드 서버
			_imageServerPath = data[ 'imageServerPath' ];
			
			// 완료 콜백
			if( completeHandler )
			{
				completeHandler.call( null );
			}
		}else{
			// 완료 콜백
			if( failHandler )
			{
				failHandler.call( null, data );
			}
		}
	}, 
	"json" );
}

function defaultSetting()
{
	var idx;
	// 1. 성별 필드
	var $selectSex = $( '.selectSex' );
	$selectSex.append( '<option value="0">'+toStringBySex( 0 )+'</option>' );
	$selectSex.append( '<option value="1">'+toStringBySex( 1 )+'</option>' );
	
	// 2. DB로 부터의 설정 정보
	getSettingInfos(
		function()
		{
			// 성공
			function setSelect( $target, datas, labelFunc )
			{
				for( idx in datas )
				{
					var _item	= datas[ idx ];
					var _name;
					if( labelFunc )
					{
						_name = labelFunc( _item );
					}else{
						_name = _item[ 'name' ];
					}
					$target.append( '<option value="'+_item[ 'code' ]+'">'+_name+'</option>' );
				}
			}
			// 메뉴 설정 부분은 로직이 특별하다.
			function setSelectMenu( $target, datas )
			{
				for( idx in datas )
				{
					var _item	= datas[ idx ];
					var _name	= _item[ 'name' ];
					
					var _type	= _item[ 'type' ];
					var _code	= _item[ 'code' ];
					
					$target.append( '<option value="'+_type+'|'+_code+'">'+_name+'</option>' );
				}
			}
			
			
			setSelect( $( '.selectRegion' ), _g_regionInfos );
			setSelect( $( '.selectEducation' ), _g_educationInfos );
			setSelect( $( '.selectMilitary' ), _g_militaryInfos );
			setSelect( $( '.selectParty' ), _g_partyInfos );
			setSelect( $( '.selectRank' ), _g_rankInfos );
			setSelect( $( '.selectDuty' ), _g_dutyInfos );
			setSelect( $( '.selectCompleted' ), _g_completedInfos );
			setSelect( $( '.selectBusiness' ), _g_businessInfos );
			setSelect( $( '.selectHistory' ), _g_historyInfos );
			setSelect( $( '.selectSns' ), _g_snsInfos );
			setSelect( $( '.selectVote' ), _g_voteInfos );
			setSelect( $( '.selectAction' ), _g_actionInfos, function( item ){ return item.name+'('+item.point+'포인트)';} );
			
			setSelect( $( '.selectModelStat' ), _g_statInfos[0] );
			setSelect( $( '.selectModelTendency' ), _g_statInfos[1] );
			
			setSelect( $( '.selectRegistPlatform' ), _g_registPlatformInfos );
			
			// 직급 -> 직책 셀렉트 박스 연동
			$( '.selectRank' ).change(function(e) {
                var _duty = $( e.target ).parentsUntil( 'table').find( '.selectDuty' );
				_duty.empty();
				
				var _dutyInfos = [];
				for( var idx in _g_dutyInfos )
				{
					if( _g_dutyInfos[ idx ].rank_code == $( this ).val() )
					{
						_dutyInfos.push( _g_dutyInfos[ idx ] );
					}
				}
				setSelect( _duty, _dutyInfos );
            });
			
			// 메뉴 설정은 데이터 스펙이 다르다.
			setSelectMenu( $( '.selectMenuList' ), _g_menuInfos );
		}
		, function(data)
		{
			// 실패 
			setResultFailForJSON( '[설정값 로드', data );
		}
	);
	
		
	// 3. 연도
	var $selectBirth = $( '.selectBirth' );
	for( var i=(new Date()).getFullYear(); i>1900; i-- )
	{
		$selectBirth.append( "<option value='"+i+"'>"+i+"</option>" )
	}
	
	// 4. 권한
	var $selectAuthor	= $( '.selectAuthor' );
	$selectAuthor.append( '<option value="0">'+toStringByAuthor( 0 )+'</option>' );
	$selectAuthor.append( '<option value="1">'+toStringByAuthor( 1 )+'</option>' );
	$selectAuthor.append( '<option value="5">'+toStringByAuthor( 5 )+'</option>' );
	
	// 5. 계정 상태
	var $selectStatus	= $( '.selectStatus' );
	$selectStatus.append( '<option value="0">'+toStringByStatus( 0 )+'</option>' );
	$selectStatus.append( '<option value="1">'+toStringByStatus( 1 )+'</option>' );
	$selectStatus.append( '<option value="9">'+toStringByStatus( 9 )+'</option>' );
	
	// 6. 논리형
	var $selectBoolean	= $( '.selectBoolean' );
	$selectBoolean.append( '<option value="0">'+toStringByBoolean( 0 )+'</option>' );
	$selectBoolean.append( '<option value="1">'+toStringByBoolean( 1 )+'</option>' );
}


// 로그인한 MEMBER SEQ 를 반환
function login_member_id()
{
	if( _loginInfo == null ) return -1;
	return _loginInfo.seq;
}
// 로그인한 MEMBER SESSION 를 반환
function login_member_session()
{
	if( _loginInfo == null ) return -1;
	return _loginInfo.sessionID;
}
// 로그인한 MEMBER NICNNAME 을 반환
function login_member_nickname()
{
	if( _loginInfo == null ) return -1;
	return _loginInfo.nickname;
}

// 권한을 문자로
function toStringByAuthor( type )
{
	switch( String(type) )
	{
		case '0':
			return '최고관리자';
		case '1':
			return '운영자';
		case '5':
			return '일반회원';
	}
}

// 현재 상태를 문자로
function toStringByStatus( type )
{
	switch( String(type) )
	{
		case '0':
			return '인증대기';
		case '1':
			return '활성';
		case '9':
			return '정지';
	}
}


// 현재 상태를 문자로
function toStringBySex( type )
{
	switch( String(type) )
	{
		case '0':
			return '남';
		case '1':
			return '여';
	}
}

// Boolean 상태를 문자로
function toStringByBoolean( type )
{
	switch( String(type) )
	{
		case '0':
			return '아니오';
		case '1':
			return '예';
	}
}

function searchSettingName( target, code, labelFunc )
{
	for( var idx in target )
	{
		if( target[ idx ].code == code )
		{
			if( labelFunc )
			{
				return labelFunc( target[ idx ] );
			}
			return target[ idx ].name;	
		}
	}
	return '[undefined]:'+code;
}

// 지명을 문자로
function toStringByRegion( code )
{
	return searchSettingName( _g_regionInfos, code );
}

// 교육 상태를 문자로
function toStringByEducation( code )
{
	return searchSettingName( _g_educationInfos, code );
}

// 병역 상태를 문자로
function toStringByMilitary( code )
{
	return searchSettingName( _g_militaryInfos, code );
}

// 정당 상태를 문자로
function toStringByParty( code )
{
	return searchSettingName( _g_partyInfos, code );
}

// 직급 상태를 문자로
function toStringByRank( code )
{
	return searchSettingName( _g_rankInfos, code );
}

// 직책 상태를 문자로
function toStringByDuty( code )
{
	return searchSettingName( _g_dutyInfos, code );
}

// 직책 상태를 문자로
function toStringByCompleted( code )
{
	return searchSettingName( _g_completedInfos, code );
}

// 직책 상태를 문자로
function toStringByBusiness( code )
{
	return searchSettingName( _g_businessInfos, code );
}

// 약력 유형을 문자로
function toStringByHistory( code )
{
	return searchSettingName( _g_historyInfos, code );
}

// SNS 유형을 문자로
function toStringBySns( code )
{
	return searchSettingName( _g_snsInfos, code );
}

// 투표 유형을 문자로
function toStringByVote( code )
{
	return searchSettingName( _g_voteInfos, code );
}

// 참여 상태를 문자로
function toStringByAction( code )
{
	return searchSettingName( _g_actionInfos, code, function( item ){ return item.name+'('+item.point+'포인트)';} );
}
// 능력치 상태를 문자로
function toStringByModelStat( code )
{
	return searchSettingName( _g_statInfos[0], code );
}
// 성향을 문자로
function toStringByModelTendency( code )
{
	return searchSettingName( _g_statInfos[1], code );
}
// 플랫폼을 문자로
function toStringByRegistPlatform( code )
{
	return searchSettingName( _g_registPlatformInfos, code );
}


// 로그인 처리
var _loginInfo;
function login( id, pass, success, fail )
{
	// 예외 처리
	// 1. 이메일 예외
	if( validateEmail( id ) == false )
	{
		alert( "이메일형식이 아닙니다." );
		return;
	}
	// 2. 비밀번호 예외
	if( pass == "" )
	{
		alert( "비밀번호를 입력해 주세요." );
		return;
	}
	
	
	$.post( getGatePath(),
		{
			__key__: 'memberLogin',
			__returnType__: 'json',
			id: id,
			pass: pass
		}, 
		function( data )
		{
			$result = $( "#result" );
			if( data.result == "SUCCESS" )
			{
				// 성공
				_loginInfo = data;
				setResult( '[이메일 로그인 성공] ID:'+ login_member_id()+', SESSION_ID:'+ login_member_session()+', 계정권한:'+toStringByAuthor( data['author'] ) );
				
				if( success )
					success.apply( this );
			}else{
				setResultFailForJSON( "[이메일 로그인] 실패", data );
				if( fail )
					fail.apply( this );
			}
			
		}, 
		"json" );
}
// 플랫폼 로그인
function loginForPlatform( platform, token, success, fail )
{
	// 예외 처리
	// 1. 플랫폼예외
	if( toStringByRegistPlatform( platform ).indexOf( 'undefined' ) > -1 )
	{
		alert( "플랫폼 선택이 잘못되었습니다." );
		return;
	}
	// 2. 토큰값 예외
	if( token == "" )
	{
		alert( "플랫폼에서 부여된 계정 토큰값을 입력해 주세요." );
		return;
	}
	
	
	$.post( getGatePath(),
		{
			__key__: 'memberLogin',
			__returnType__: 'json',
			platform: platform,
			token: token
		}, 
		function( data )
		{
			$result = $( "#result" );
			if( data.result == "SUCCESS" )
			{
				// 성공
				_loginInfo = data;
				setResult( '[플랫폼 로그인 성공] ID:'+ login_member_id()+', SESSION_ID:'+ login_member_session()+', 계정권한:'+toStringByAuthor( data['author'] ) );
				
				if( success )
					success.apply( this );
			}else{
				setResultFailForJSON( "[플랫폼 로그인] 실패", data );
				if( fail )
					fail.apply( this );
			}
			
		}, 
		"json" );
}

// [[ 목록 조회 함수 ]]
function selectAllMembers( page, numPerPage, completeHandler, failHandler )
{
	$.post( getGatePath(),
	{
		__key__: 'selectMembers',
		__returnType__: 'json',
		page: page,
		numPerPage: numPerPage
	},
	function( data )
	{
		if( data.result == "SUCCESS" )
		{
			// 완료 콜백
			if( completeHandler )
			{
				completeHandler.call( null, data );
			}
		}else{
			// 실패 콜백
			if( failHandler )
			{
				failHandler.call( null, data );
			}
		}
	},
	'json');
}

// [[ 목록 조회 함수 ]]
function selectAllModels( page, numPerPage, completeHandler, failHandler )
{
	$.post( getGatePath(),
	{
		__key__: 'selectModels',
		__returnType__: 'json',
		page: page,
		numPerPage: numPerPage
	},
	function( data )
	{
		if( data.result == "SUCCESS" )
		{
			// 완료 콜백
			if( completeHandler )
			{
				completeHandler.call( null, data );
			}
		}else{
			// 실패 콜백
			if( failHandler )
			{
				failHandler.call( null, data );
			}
		}
	},
	'json' );
}

// [[ 목록 조회 함수 ]]
function selectAllBusinesses( page, numPerPage, completeHandler, failHandler )
{
	$.post( getGatePath(),
	{
		__key__: 'selectBusinesses',
		__returnType__: 'json',
		page: page,
		numPerPage: numPerPage
	},
	function( data )
	{
		if( data.result == "SUCCESS" )
		{
			// 완료 콜백
			if( completeHandler )
			{
				completeHandler.call( null, data );
			}
		}else{
			// 실패 콜백
			if( failHandler )
			{
				failHandler.call( null, data );
			}
		}
	},
	'json' );
}

// [ 자유 게시판 목록 조회 ]
function selectAllFreeBoard( page, numPerPage, completeHandler, failHandler )
{
	$.post( getGatePath(),
	{
		__key__: 'selectFreeBoardList',
		__returnType__: 'json',
		page: page,
		numPerPage: numPerPage
	},
	function( data )
	{
		if( data.result == "SUCCESS" )
		{
			// 완료 콜백
			if( completeHandler )
			{
				completeHandler.call( null, data );
			}
		}else{
			// 실패 콜백
			if( failHandler )
			{
				failHandler.call( null, data );
			}
		}
	},
	'json' );
}


// [ 이미지 경로 생성 ]
var _imageServerPath = '';
function getImageURL( link )
{
	return _imageServerPath+link;
}

function createViewImageLink( path, label )
{
	if( label == undefined ) label = 'View';
	return '<a href="'+getImageURL( path )+'" target="_blank">'+label+'</a>';
}


// [ 팝업에 대표 이미지 버튼 생성 및 설정 ]
function setPicture( $popup, pictureInfo, thumbnailInfos )
{
	// 대표 이미지
	$popup.find( '#prePicture' ).empty();
	if( pictureInfo && pictureInfo[ 'link' ] )
	{ 
		var _picture 	= '<div>'
					+'<img width="30" height="30" src="'+getImageURL( pictureInfo[ 'link' ] )+'"/>'
					+'<input type="button" value="remove" class="btn_pictureRemove btn_dynamicFile" />'
					+'</div>';
		$popup.find( '#prePicture' ).append( _picture );
	}

	// 썸네일 설정
	$popup.find( '#preThumbs' ).empty();
	for( var idx in thumbnailInfos )
	{
		var _thumbInfo = thumbnailInfos[ idx ];
		
		var _thumbItem 	= '<div>'
							+'<img width="30" height="30" src="'+getImageURL( _thumbInfo[ 'link' ] )+'"/>'
							+'<input type="button" value="remove" class="btn_thumbRemove btn_dynamicFile" seq="'+_thumbInfo[ 'seq' ]+'"/>'
							+'</div>';
		$popup.find( '#preThumbs' ).append( _thumbItem );
	}
	
	// 대표이미지 제어 버튼
	$popup.find( '.btn_pictureRemove' ).bind( 'click', function( e )
	{
		$popup.find( 'input[type="hidden"][name="removePicture"]' ).val( pictureInfo[ 'seq' ]  );
		$(this).parent().hide();
	});
	
	// 썸네일 제어 버튼
	$popup.find( '.btn_thumbRemove' ).bind( 'click', function( e )
	{
		var $removeThumbs = $popup.find( 'input[type="hidden"][name="removeThumbs"]' );
		var _preVal = $removeThumbs.val();
		if( _preVal == "" )
		{
			$removeThumbs.val( $(this).attr( 'seq' ) );
		}else{
			$removeThumbs.val( _preVal + "|" + $(this).attr( 'seq' ) );
		}
		
		$(this).parent().hide();
	});
	
	// 파일 선택 버튼
	$popup.find( 'input[type="hidden"][name="removePicture"]' ).val( '' );
	$popup.find( 'input[type="hidden"][name="removeThumbs"]' ).val( '' );
	$pictureSelector = $popup.find( 'input[type="file"][name="picture"]' );
	$pictureSelector.replaceWith( $pictureSelector = $pictureSelector.clone( true ) );
	$thumbSelector = $popup.find( 'input[type="file"][name="thumbs[]"]' );
	$thumbSelector.replaceWith( $thumbSelector = $thumbSelector.clone( true ) );
}


// 서버에서 전달된 Datetime 값을 datetime-local 필드에 맞도록 수정
function convertDatetimelocalValue( $value )
{
	var _arr = $value.split( " " );
	return _arr.join( "T" );
}